#!/bin/bash

set -e

# 获取组件版本和名称的函数
function get_comp_ver() {
    comp_ver=$(head mds/service.json | grep version | awk 'NR==1'| awk -F: '{print $2}' \
        | awk -F\" '{print $2}')||:
    echo "comp_ver $comp_ver"
    export comp_ver
}

function get_comp_name() {
    comp_name=$(head mds/service.json | grep name | awk 'NR==1' | awk -F: '{print $2}' \
        | awk -F\" '{print $2}')||:
    echo "comp_name $comp_name"ma
    export comp_name
}

function find_sed_comp_ver() {
    # 定义要搜索的目录数组
    search_dirs=("build/subsys/rc" "build/subsys/stable")

    # 遍历所有需要搜索的目录
    for dir in "${search_dirs[@]}"; do
        echo "正在搜索目录: $dir"
        
        # 查找包含组件的YAML文件并更新版本
        find "$dir" -name "*.yml" -exec grep -l "$comp_name" {} \; | while read yaml_file; do
            echo "找到包含 $comp_name 的文件: $yaml_file"
            
            # 提取文件中的通道信息（rc 或 stable）
            channel=$(grep "$comp_name" "$yaml_file" | head -1 | grep -o '@openUBMC.release/.*"' | cut -d'/' -f2 | tr -d '"')
            
            if [ -z "$channel" ]; then
                echo "警告: 无法从文件 $yaml_file 中提取通道信息，跳过此文件"
                continue
            fi
            
            echo "检测到通道: $channel"
            
            # 使用sed更新版本号
            # 匹配模式: "组件名/任意版本号@openUBMC.release/通道"
            # 替换为: "组件名/新版本号@openUBMC.release/通道"
            sed -i "s/\"$comp_name\/[0-9.]*@openUBMC.release\/$channel\"/\"$comp_name\/$comp_ver@openUBMC.release\/$channel\"/g" "$yaml_file"
            
            echo "已更新 $yaml_file 中的 $comp_name 版本为 $comp_ver (通道: $channel)"
            
            # 验证更改
            echo "更改后的内容:"
            grep -n "$comp_name" "$yaml_file"
        done
    done

    echo "版本更新完成!"
}

function build_bmc_cpio() {
    bingo build -sc qemu

    # 检查output/packet/inner有没有仿真镜像包.cpio.gz包
    cpio_files=$(ls output/packet/inner/*.cpio.gz 2>/dev/null | wc -l)
    if [ "$cpio_files" -eq 0 ]; then
        echo "❌ 错误：未找到任何.cpio.gz包文件"
        echo "当前目录内容: "
        ls -la output/packet/inner/
        exit 1
    fi

    echo "manifest仓的output目录内容: "
    ls -l output/packet/inner/
}

function running_qemu() {
    {
        python3 build/works/packet/qemu_shells/vemake_1711.py &
        QEMU_PID=$!
        sleep 30  # 等待QEMU初始化
    } > qemu_start.log 2>&1

    # 验证QEMU是否运行
    if ! ps -p $QEMU_PID > /dev/null; then
        echo "❌ QEMU启动失败"
        exit 1
    fi
    echo "✅ QEMU已启动(PID:$QEMU_PID)"
}

function download_testing_code() {
    cd ..
    rm -rf qemu
    git clone https://gitcode.com/openUBMC/qemu.git
    cd ~/qemu/test
}

function smoke_testing() {
    python3 smoke_test/install_dependency.py
    ps aux | grep qemu
    python3 smoke_test/execute.py
    python3 smoke_test/testing.py
}

# 1. 环境准备
echo "======prepare env====="
rm -rf fructrl
rm -rf manifest
git clone git@gitcode.com:openUBMC/fructrl.git
git clone git@gitcode.com:openUBMC/manifest.git

cd fructrl
bingo build

# 调用函数获取版本和名称
get_comp_ver
get_comp_name

# 2. 侵入式修改组件的版本号
echo "======sed component version====="
cd ../manifest
find_sed_comp_ver

# 3. 构建仿真镜像包
echo "======Start build bmc simulation mirror package====="
build_bmc_cpio

# 4.运行qemu（后台运行+日志记录）
echo "======Start running qemu===="
running_qemu

# 5.下载测试代码
# 扩展性：未来社区开发者可以替换为自己的自动测试代码仓并在里面执行冒烟测试脚本
echo "======Download test code===="
download_testing_code

# 6.进行冒烟测试
# 冒烟测试脚本是存放在自动测试代码仓的
echo "======Start smoke testing===="
smoke_testing
